#pragma once

#include<iostream>
#include<pthread.h>
#include <signal.h>
#include"Log.hpp"
#include"TcpServer.hpp"
#include"Task.hpp"
#include"ThreadPool.hpp"

#define PORT 8081

class HttpServer{
    private:
    int port;
    bool stop;
  public:
        HttpServer(int _port = PORT): port(_port),stop(false)
        {}
        void InitServer()
        {
            //信号SIGPIPE需要进行忽略，如果不忽略，在写入时候，可能直接崩溃server
            signal(SIGPIPE, SIG_IGN); 
        }
        void Loop()
        {
            TcpServer *tsvr = TcpServer::getinstance(port);
            LOG(INFO, "Loop begin");
            while(!stop){
                struct sockaddr_in peer;
                socklen_t len = sizeof(peer);
                int sock = accept(tsvr->Sock(), (struct sockaddr*)&peer, &len);
                if(sock < 0){
                    continue;
                }
                LOG(INFO, "Get a new link");
                Task task(sock);
                ThreadPool::getinstance()->PushTask(task);
            }
        }
        ~HttpServer()
        {}
     //thread_pool.PushTask(task);
     //分离线程
      //分离线程，他的存储器资源在他终止的时候可以由系统自动释放
      //1.默认情况下，新创建的线程是joinable的，线程退出后，需对其进行pthread_join操作，否则无法释放资源，从而造成系统泄露
      //2.如果不关心线程的返回值，join是一种负担，这个时候，我们可以告诉系统，当线程退出时，自动释放线程资源

};